package reflect;

import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 *
 * reflect
 *
 * 测试代理
 * 2018/5/7-21:32
 * 2018
 * Created by wuqiang on 2018/5/7.
 */
public class ProxyTest {
    /**
     * 测试动态代理。
     * 代理对象Person，在调用eat方法，先打印“祈祷”，吃完之后，再打印“吃饱了”。
     * 其实就是AOP编程
     */
    @Test
    public void testProxy() throws Exception {
        /**
         * 生成Person的代理对象
         */
        Person p=new Person();
        Activity e= (Activity) Proxy.newProxyInstance(this.getClass().getClassLoader(),
                new Class[] { Activity.class },new PersonInvokeHandler(p));
        e.eat("food");
        e.run(500D);
    }

    class PersonInvokeHandler implements InvocationHandler{
        private Person p;

        public PersonInvokeHandler(Person p) {
            this.p = p;
        }

        /**
         *
         * @param proxy 被代理对象
         * @param method 被代理对象的方法
         * @param args 被代理的对象的方法参数
         * @return
         * @throws Throwable
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("祈祷");
            System.out.println("方法名称："+method.getName());
            method.invoke(p,args);
            System.out.println("吃饱了");
            return null;
        }
    }
}
